package org.ceteca.explica.client.traceability;

import java.rmi.AccessException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.ArrayList;
import java.util.Iterator;

import org.ceteca.explica.core.InterfaceExplica;
import org.ceteca.explica.core.installer.Installer;
import org.ceteca.explica.core.installer.ResourceException;
import org.ceteca.explica.core.installer.ResourceOT;
import org.ceteca.explica.core.traceability.Tracer;
import org.ceteca.explica.core.traceability.TracerException;
import org.ceteca.explica.core.traceability.tree.TraceabilityTree;

public class TraceabilityTreeViewer {
	public TraceabilityTree parseTree(String filename) {
		TraceabilityTree tree = null;
		
		try {
			// El servidor de registro de RMI devuelve un objeto remoto genérico
			// que debe ser convertido al tipo correspondiente. Ojo: El nombre por el
			// que buscamos debe coincidir con el que se le dio al servicio en el
			// momento en que se registró (AlmacenImpl.java)
			Registry registry = LocateRegistry.getRegistry(InterfaceExplica.RMI_REGISTRY_PORT);
            System.out.println("Registry located");
            Tracer tracer = (Tracer)registry.lookup(InterfaceExplica.JNDI_TRACER_EXPORT_NAME);
			System.out.println("Tracer located");

			// Read the content of the traceability tree into a byte[]
			byte[] xmlContent = new byte[10];
				
			// Parse the traceability file and build the traceability tree
			tree = tracer.buildTraceabilityTree(xmlContent);
		}
		catch (AccessException aEx) {
			System.err.println("Se rechazó el acceso. Su sistema no tiene los permisos necesarios para realizar la operación remota!");
			aEx.printStackTrace();
		}
		catch (NotBoundException nEx) {
			System.err.println("El nombre del objeto no está asociado a un objeto remoto registrado!");
			nEx.printStackTrace();
		}
		catch (RemoteException rEx) {
			System.err.println("No se encontró el servicio o hubo errores al llamar a los métodos remotos!");
			rEx.printStackTrace();
		}
		catch (TracerException tEx) {
			System.err.println("Error construyendo el arbol de trazabilidad!");
			tEx.printStackTrace();
		}
		
		return tree;
	}
}
